package com.doctcloud.datacloud.task;

import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;

import static com.doctcloud.common.core.zip.zipUtils.zipTargetFolderWithPassword;

/**
 * @author :  doctCloud samula
 * @date :  2025/11/26
 * @Descript :
 */
@Component
public class ZipExport {
    private static final Logger log = LoggerFactory.getLogger(ZipExport.class);
    public void ZipTrans(){
        System.out.println("--- 开始执行加密压缩任务 ---");

        // 1. 准备工作：定义源文件夹、目标ZIP文件路径和密码
        String sourceFolderPath = "d:/target"; // 要被压缩的文件夹
        String zipFilePath = "d:/zip/2024-05-20_encrypted.zip"; // 生成的ZIP文件路径
        String zipPassword = "MySecretPassword123!"; // 压缩密码

        File sourceDir = new File(sourceFolderPath);

        try {
            // 3. 调用压缩方法
           zipTargetFolderWithPassword(
                    new File(sourceFolderPath),
                    zipFilePath,
                    zipPassword
            );

            System.out.println("--- 压缩任务执行成功 ---");

            // 3. 压缩成功后，删除原始文件夹
            if (sourceDir.exists()) {
                boolean deletionSuccess = deleteDirectory(sourceDir);
                if (deletionSuccess) {
                    log.info("原始文件夹已成功删除: {}", sourceFolderPath);
                } else {
                    log.warn("原始文件夹删除失败: {}", sourceFolderPath);
                }
            } else {
                log.warn("压缩成功，但原始文件夹不存在，无需删除: {}", sourceFolderPath);
            }

        } catch (RuntimeException e) {
            // 4. 捕获并处理异常
            System.err.println("--- 压缩任务失败 ---");
            System.err.println("失败原因: " + e.getMessage());
            // 在实际项目中，这里可以记录日志、返回错误信息给前端等
        }

    }

    /**
     * 递归删除文件或文件夹及其所有内容
     * @param file 要删除的文件或文件夹
     * @return 如果删除成功返回 true，否则返回 false
     */
    private static boolean deleteDirectory(File file) {
        // 如果是文件，直接删除
        if (file.isFile()) {
            boolean deleted = file.delete();
            if (deleted) {
                log.info("成功删除文件: {}", file.getAbsolutePath());
            } else {
                log.warn("无法删除文件: {}", file.getAbsolutePath());
            }
            return deleted;
        }

        // 如果是文件夹，递归删除其内容
        if (file.isDirectory()) {
            File[] allContents = file.listFiles();
            if (allContents != null) {
                for (File content : allContents) {
                    // 递归删除子文件或子文件夹
                    deleteDirectory(content);
                }
            }

            // 最后删除空文件夹
            boolean deleted = file.delete();
            if (deleted) {
                log.info("成功删除文件夹: {}", file.getAbsolutePath());
            } else {
                log.warn("无法删除文件夹: {}", file.getAbsolutePath());
            }
            return deleted;
        }

        // 如果文件/文件夹不存在，也视为成功
        log.warn("文件或文件夹不存在，无需删除: {}", file.getAbsolutePath());
        return true;
    }
}
